home *** CD-ROM | disk | FTP | other *** search
/ PC World 2007 June / PCWorld_2007-06_cd.bin / v cisle / tclock / tclocklight-040702-3.exe / source / common / localeinfo.c < prev    next >
C/C++ Source or Header  |  2004-02-01  |  4KB  |  165 lines

  1. /*-------------------------------------------------------------
  2.   localeinfo.c : get locale infomation, date and time format
  3.   (C) 1997-2003 Kazuto Sato
  4.   Please read readme.txt about the license.
  5.   
  6.   Written by Kazubon, Nanashi-san
  7. ---------------------------------------------------------------*/
  8.  
  9. #include "common.h"
  10.  
  11. /* Globals */
  12.  
  13. int GetCodePage(int ilang);
  14. int MyGetLocaleInfoW(int ilang, int codepage,
  15.     LCTYPE lctype, wchar_t* dst, int n);
  16. int MyGetLocaleInfoA(int ilang, int codepage,
  17.     LCTYPE lctype, char* dst, int n);
  18. int MyGetDateFormatW(int ilang, int codepage,
  19.     DWORD dwFlags, CONST SYSTEMTIME *t,
  20.     wchar_t* fmt, wchar_t* dst, int n);
  21. int MyGetTimeFormatW(int ilang, int codepage,
  22.     DWORD dwFlags, CONST SYSTEMTIME *t,
  23.     wchar_t* fmt, wchar_t* dst, int n);
  24.  
  25. /*------------------------------------------------
  26.   get codepage from locale
  27. --------------------------------------------------*/
  28. int GetCodePage(int ilang)
  29. {
  30.     char buf[10];
  31.     WCHAR bufw[10];
  32.     int r;
  33.     int codepage = CP_ACP;
  34.     LCID locale;
  35.     
  36.     locale = MAKELCID((WORD)ilang, SORT_DEFAULT);
  37.     
  38.     if(GetVersion() & 0x80000000) // 95/98/Me
  39.     {
  40.         r = GetLocaleInfoA(locale, LOCALE_IDEFAULTANSICODEPAGE, buf, 10);
  41.         if(r) codepage = atoi(buf);
  42.     }
  43.     else  // NT4/2000/XP
  44.     {
  45.         r = GetLocaleInfoW(locale, LOCALE_IDEFAULTANSICODEPAGE, bufw, 10);
  46.         if(r) codepage = _wtoi(bufw);
  47.     }
  48.     
  49.     if(!IsValidCodePage(codepage)) codepage = CP_ACP;
  50.     return codepage;
  51. }
  52.  
  53. /*------------------------------------------------
  54.   get locale information by Unicode
  55. --------------------------------------------------*/
  56. int MyGetLocaleInfoW(int ilang, int codepage,
  57.     LCTYPE lctype, wchar_t* dst, int n)
  58. {
  59.     int r;
  60.     LCID locale;
  61.     
  62.     *dst = 0;
  63.     locale = MAKELCID((WORD)ilang, SORT_DEFAULT);
  64.     
  65.     if(GetVersion() & 0x80000000) // 95/98/Me
  66.     {
  67.         char buf[80];
  68.         r = GetLocaleInfoA(locale, lctype, buf, 80);
  69.         if(r)
  70.             MultiByteToWideChar(codepage, 0, buf, -1, dst, n);
  71.     }
  72.     else  // NT4/2000/XP
  73.         r = GetLocaleInfoW(locale, lctype, dst, n);
  74.     
  75.     return r;
  76. }
  77.  
  78. /*------------------------------------------------
  79.   get locale information by ANSI
  80. --------------------------------------------------*/
  81. int MyGetLocaleInfoA(int ilang, int codepage,
  82.     LCTYPE lctype, char* dst, int n)
  83. {
  84.     int r;
  85.     LCID locale;
  86.     
  87.     *dst = 0;
  88.     locale = MAKELCID((WORD)ilang, SORT_DEFAULT);
  89.     
  90.     if(GetVersion() & 0x80000000) // 95/98/Me
  91.         r = GetLocaleInfoA(locale, lctype, dst, n);
  92.     else  // NT4/2000/XP
  93.     {
  94.         WCHAR buf[80];
  95.         r = GetLocaleInfoW(locale, lctype, buf, 80);
  96.         if(r)
  97.         {
  98.             int codepage = GetCodePage(GetUserDefaultLangID());
  99.             r = WideCharToMultiByte(codepage, 0, buf, -1, dst, n,
  100.                 NULL, NULL);
  101.         }
  102.     }
  103.     
  104.     return r;
  105. }
  106.  
  107. /*------------------------------------------------
  108.   GetDateFormat() for 95/NT
  109. --------------------------------------------------*/
  110. int MyGetDateFormatW(int ilang, int codepage,
  111.     DWORD dwFlags, CONST SYSTEMTIME *t,
  112.     wchar_t* fmt, wchar_t* dst, int n)
  113. {
  114.     int r;
  115.     LCID Locale;
  116.     
  117.     *dst = 0;
  118.     Locale = MAKELCID((WORD)ilang, SORT_DEFAULT);
  119.     if(GetVersion() & 0x80000000) // 95
  120.     {
  121.         char buf[80], afmt[40];
  122.         if(fmt)
  123.             WideCharToMultiByte(codepage, 0, fmt, -1,
  124.                 afmt, 39, NULL, NULL);
  125.         r = GetDateFormatA(Locale, dwFlags, t, fmt ? afmt : NULL, buf, 79);
  126.         if(r)
  127.             r = MultiByteToWideChar(codepage, 0, buf, -1, dst, n);
  128.     }
  129.     else  // NT
  130.     {
  131.         r = GetDateFormatW(Locale, dwFlags, t, fmt, dst, n);
  132.     }
  133.     return r;
  134. }
  135.  
  136. /*------------------------------------------------
  137.   GetTimeFormat() for 95/NT
  138. --------------------------------------------------*/
  139. int MyGetTimeFormatW(int ilang, int codepage,
  140.     DWORD dwFlags, CONST SYSTEMTIME *t,
  141.     wchar_t* fmt, wchar_t* dst, int n)
  142. {
  143.     int r;
  144.     LCID Locale;
  145.     
  146.     *dst = 0;
  147.     Locale = MAKELCID((WORD)ilang, SORT_DEFAULT);
  148.     if(GetVersion() & 0x80000000) // 95
  149.     {
  150.         char buf[80], afmt[40];
  151.         if(fmt)
  152.             WideCharToMultiByte(codepage, 0, fmt, -1,
  153.                 afmt, 39, NULL, NULL);
  154.         r = GetTimeFormatA(Locale, dwFlags, t, fmt ? afmt : NULL, buf, 79);
  155.         if(r)
  156.             r = MultiByteToWideChar(codepage, 0, buf, -1, dst, n);
  157.     }
  158.     else  // NT
  159.     {
  160.         r = GetTimeFormatW(Locale, dwFlags, t, fmt, dst, n);
  161.     }
  162.     return r;
  163. }
  164.  
  165.